<?php
# Experimental
# 自动执行的计划任务，加入于 2009-02-19
# 要用静态计数器计数，每天一次
# hashData : hkey: CronLastDone hvalue: date(2009-03-05)
/**
 * 1. 每周自动更新标签值，如果标签失效（没有新闻带有该标签，则剔除）
 * *2. 新闻自动归档处理（在过期新闻标题前加上"Archive"标记）
 * 3. 维护 hashdata 表
 *    强制清空 某些字段的值
 * *4  自动重做 teacher_course 的 id索引值 ：
 *         方法：读出所有 行的值，作为数组值
 *               sizeof() 获得数组长度，用 for 循环重造 id = $i.
 *               $rowset = array(
 *                  array(),       // 用 循环计数器$i 代替数据记录行的 id值，然后先执行 SQL:TRUNCATE TABLE，再$_table->createRowset()
 *                  array(),
 *                  …………,
 *                );
 * 5  自动重置 教师密码
 * 6  优化Mysql 表，删除冗余数据
 * 7  删除所有没有文章的分类
 * 8  删除所有标题或内容中存在 {$keyword} 的新闻 -- 屏蔽关键字
 * 9  替换所有标题或内容中存在 {$keyword} 的新闻， 用  $safeWord 替换 $sensitiveWord -- 屏蔽关键字
 */
/** UI 控制点：
 */
class Controller_BoCron extends Controller_Boprepare
{
    public function actionListCron()
    {
        $this->_view['cssfile'] = 'bocron.css';
    }

    public function actionExecuteCron()
    {
        $jobList = isset($_POST['job']) ? $_POST['job'] : NULL;

        if($jobList)
        {
            foreach($jobList as $job)
            {
                $operation = 'cron_pkg_'.$job;
                $this->$operation();         // 执行各分部清理操作
            }
        }

        $this->_forward('bocron/finishcron');
    }

    /**
     * 优化表
     */
    private function cron_pkg_OptimizeTable()
    {
        QDB::getConn()->execute('OPTIMIZE TABLE news');
        QDB::getConn()->execute('OPTIMIZE TABLE news_ctgry');
        QDB::getConn()->execute('OPTIMIZE TABLE news_attachment');
        QDB::getConn()->execute('OPTIMIZE TABLE tag');

        QDB::getConn()->execute('OPTIMIZE TABLE file');
        QDB::getConn()->execute('OPTIMIZE TABLE file_ctgry');

        QDB::getConn()->execute('OPTIMIZE TABLE research');
        QDB::getConn()->execute('OPTIMIZE TABLE research_ctgry');

        QDB::getConn()->execute('OPTIMIZE TABLE teacher');
        QDB::getConn()->execute('OPTIMIZE TABLE teacher_course');
        QDB::getConn()->execute('OPTIMIZE TABLE teacher_title');
        QDB::getConn()->execute('OPTIMIZE TABLE course');
        QDB::getConn()->execute('OPTIMIZE TABLE major');
        QDB::getConn()->execute('OPTIMIZE TABLE title');
        QDB::getConn()->execute('OPTIMIZE TABLE tdoc');

        QDB::getConn()->execute('OPTIMIZE TABLE hashdata');
        QDB::getConn()->execute('OPTIMIZE TABLE module');

        QDB::getConn()->execute('OPTIMIZE TABLE t_browser_by_date');
        QDB::getConn()->execute('OPTIMIZE TABLE t_hit_by_date');
        QDB::getConn()->execute('OPTIMIZE TABLE t_hour');
        QDB::getConn()->execute('OPTIMIZE TABLE t_ip_by_date');
        QDB::getConn()->execute('OPTIMIZE TABLE t_referer_by_date');
        QDB::getConn()->execute('OPTIMIZE TABLE t_unknown_broswer_by_date');
        QDB::getConn()->execute('OPTIMIZE TABLE t_uri_by_date');
    }

    /**
     * 重置流量表
     */
    private function cron_pkg_clearURLInfo()
    {
        QDB::getConn()->execute('TRUNCATE TABLE t_uri_by_date');
    }
    private function cron_pkg_clearIPInfo()
    {
        QDB::getConn()->execute('TRUNCATE TABLE t_ip_by_date');
    }
    private function cron_pkg_clearHourInfo()
    {
        THour::meta()->updateDbWhere(new QDB_Expr('hits = 0'), NULL);
    }
    private function cron_pkg_clearBrowserInfo()
    {
        QDB::getConn()->execute('TRUNCATE TABLE t_browser_by_date');
        QDB::getConn()->execute('TRUNCATE TABLE t_unknown_browser_by_date');
    }
    private function cron_pkg_clearRefererInfo()
    {
        QDB::getConn()->execute('TRUNCATE TABLE t_referer_by_date');
    }

    /**
     * 短格式日期 09-01-01
     */
    private function cron_pkg_formatNewsAdate2short()
    {
        $news = News::find()->all()->query();

        foreach($news as $n)
        {
            $n->adate = date('y-m-d', $n->adated);
            $n->save();
        }
    }
    /**
     * 长格式日期 2009-01-01
     */
    private function cron_pkg_formatNewsAdate2long()
    {
        $news = News::find()->all()->query();

        foreach($news as $n)
        {
            $n->adate = date('Y-m-d', $n->adated);
            $n->save();
        }
    }
    /**
     * 添加"(过期)"标志
     */
    private function cron_pkg_markArchive()
    {
        $timeEndStamp  = $_SERVER['REQUEST_TIME'] - 31536000;  // 一年前
        $toArchiveNews = News::find('adated < ? AND adated > 1000000', $timeEndStamp)->all()->query();

        foreach($toArchiveNews as $n)
        {
            $n->title = '(过期)'.$n->title;
            $n->save();
        }
    }
    /**
     * 清除"(过期)"标志
     */
    private function cron_pkg_removeArchive()
    {
        $archivedNews = News::find('title like ?', '(过期)%')->all()->query();

        foreach($archivedNews as $n)
        {
            $n->title = str_replace('(过期)', '', $n->title);
            $n->save();
        }
    }

    /**
     * 删除离开的老师的全部信息（不可逆）
     */
    private function cron_pkg_DropOutTeachers()
    {
        $teachers = Teacher::find('status = ?', 'out')->all()->query();

        foreach($teachers as $teacher)
        {
            Teacher::meta()      ->deleteWhere('teacher_id = ?', $teacher->teacher_id);
            Login::meta()        ->deleteWhere('teacher_id = ?', $teacher->teacher_id);
            TeacherCourse::meta()->deleteWhere('teacher_id = ?', $teacher->teacher_id);
            TeacherTitle::meta() ->deleteWhere('teacher_id = ?', $teacher->teacher_id);

            // 删除头像文件
            unlink($teacher->profile_path);

            // 删除课件
            $tdocs = Tdoc::find('teacher_id = ?', $teacher->teacher_id)->all()->query();
            foreach($tdocs as $tdoc)
            {
                unlink($tdoc->filepath);
                $tdoc->destroy();
            }
        }
    }
    /**
     * 强制重置老师登录密码为 -9999999
     */
    private function cron_pkg_ResetCibPwd()
    {
        Login::meta()->updateDbWhere(new QDB_Expr('cib_pwd = -9999999'), NULL);
    }
    /**
     * 删除没有老师教授的课程
     */
    private function cron_pkg_RemoveUnlinkedCourses()
    {
        $ycourses = array_unique(TeacherCourse::find()->all()->query()->values('course_id'));
        Course::meta()->deleteWhere('course_id not in (?)', $ycourses);
    }

    /**
     * 更新最后一次 Cron 执行日期
     */
    private function actionFinishCron()
    {
        AppStore::meta()->updateDbWhere(new QDB_Expr('hvalue = ?', $_SERVER['REQUEST_TIME']), 'hkey = ?', 'CronLastExecuted');
    }
}